package com.json;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class RegExpTest {
/**
	零宽度负预测先行断言(?!exp)，断言此位置的后面不能匹配表达式exp。
	例如：\d{3}(?!\d)匹配三位数字，而且这三位数字的后面不能是数字；
	\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。 

	(?=exp)也叫零宽度正预测先行断言，它断言自身出现的位置的后面能匹配表达式exp。
	比如\b\w+(?=ing\b)，匹配以ing结尾的单词的前面部分(除了ing以外的部分)，
	如查找I'm singing while you're dancing.时，它会匹配sing和danc。
*/	
	/**
	 * 在《精通正则表达式》书中，翻译分别为：否定型顺序环视（negative lookahead)和肯定型顺序环视（positive lookahead)。
	 * 匹配的是符合表达式的 “位置”而非“字符”。“顺序”表示从左往右看，相对的还有“逆序”即从右往左看 ?<= ?<!
	 * 环视的作用
       1.它匹配的是一个精确的位置
                  比如要匹配autumn里的tu 用普通的方法就不行 必须要用到环视(?<=au)tu(?=mn)
       2.在global match的时候 下一次的匹配时从上一次环视找到的位置开始的
                 比如autumn的例子 下一次是从mn开始的 而不是从n后面开始的
	 * */
    public static String getResultStr(String educations){
		if(StringUtils.isNotBlank(educations)){
			Document docu= Jsoup.parse(educations);
			Elements eles=docu.select("tr");
			Pattern p=Pattern.compile("(\\d{4}\\-\\d{1,2}\\s+~).+");
//			Pattern p=Pattern.compile("(?=(\\d{4}\\s+/\\d{1,2}--)).+");
			JSONArray array = new JSONArray();
			for (int i = 0; i < eles.size();i++) {
				if(p.matcher(eles.eq(i).text()).matches()){
					JSONObject obj=new JSONObject();
					Elements tds=eles.eq(i).select("td");
				   //设置开始、结束时间
					putEdDate(tds.eq(0).text(),obj);
					obj.put("jobName", tds.eq(1).text());
					obj.put("corpName", tds.eq(2).text());
					obj.put("workDescription",eles.eq(++i).select("td").text().replace("&lt;br&gt;","<br/>"));
					array.add(obj);
				}
			}
			educations = array.toString();
		}else{
			educations = new JSONArray().toString();
		}
		return educations;
    }
    
    public static JSONObject putEdDate(String value, JSONObject jsonObj){
    	//设置开始结束时间
	  	jsonObj.put("fromYear",getGroupOne(value,"(\\d{4})\\-\\d{1,2}\\s+~"));
	  	jsonObj.put("fromMonth",getGroupOne(value,"\\d{4}\\-(\\d{1,2})\\s+~"));
	  	jsonObj.put("toYear",getGroupOne(value,"\\s+~\\s+(\\d{4})\\-\\d{1,2}"));
	  	jsonObj.put("toMonth",getGroupOne(value,"\\s+~\\s+\\d{4}\\-(\\d{1,2})"));
	  	if(StringUtils.isNotBlank(getGroupOne(value,"(\\s+~$)"))){
		  	jsonObj.put("toYear","0");
		  	jsonObj.put("toMonth","0");
	  	}
	  	return jsonObj;
    }

	public static String getGroupOne(String obj,String pattern){
		return getGroup(obj, pattern, 1);
	}
	public static String getGroup(String obj,String pattern,int index){
		Pattern grepPattern = Pattern.compile(pattern);
		if (grepPattern != null) {
			Matcher m = grepPattern.matcher(obj.toString());
			if (m.find()) {
				return m.group(index);
			} else {
				return "";
			}
		} else {
			return obj;
		}
	}
	
	public static void main(String[] args) {
		String educations = "<tr><tr><td class='text_left' width='26%'>2006-09 ~ </td><td class='text' width='30%'>南京工业大学</td><td class='text' width='30%'>英语</td><td class='text' width='14%'>本科</td></tr><tr><td>英语专业培养要求：<td></tr></tr>";
//		String educations = "<tr><tr><td class='text_left' width='26%'>2004 /9--2008 /6</td><td class='text' width='30%'>南京工业大学</td><td class='text' width='30%'>英语</td><td class='text' width='14%'>本科</td></tr><tr>英语专业培养要求：</tr></tr>";
		String teString = "<html>"
 +"<body>"
  +"<table class='fieldtable' border='0' cellpadding='2' cellspacing='0' width='100%'>"
   +"<tbody>" 
    +"<tr> "
     +"<td class='style28'> <span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_labStartDate'>2010-08</span> ~ <span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_labEndDate'>2012-6</span></td> "
     +" <td class='style28'> <span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_labTitle'>中级软件工程师</span></td> "
     +" <td class='style30'> <span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_labCompany'>深圳埃斯欧纳人力资源有限公司(红桃网)</span></td> "
     +"  <td class='style7'> <span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_Label80' color='#486186' style='font-weight:700'>月薪：</span></td> "
     +"  <td class='fieldContent' colspan='2'> <span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_labSalary'>保密</span> </td> "
     +"  </tr> "
     +"  <tr> "
     +"   <td colspan='6' class='fieldContent'><span id='Tab_tpResumeCN_ResumeCN_repWorkExperience_ctl01_labDescription'>? 参与红桃网研发工作，主要负责信息处理中心的人脉、职位与推荐系统搜索相关底层封装、接口开发和性能优化等工作。（采用lucene检索技术解决企业级搜索与推荐匹配服务）</span></td> "
     +"  </tr> "
     +"  </tbody> "
     +" </table>"
     +"</body>"
     +"</html>";
		System.out.println(getResultStr(teString));
	}
	
}
